package com.quanyan.club.service;


import com.quanyan.api.APIResponse;
import com.quanyan.club.entity.db.TbClubOfflineMemberAccount;
import com.quanyan.club.entity.db.TbClubOnlineMemberAccount;
import com.quanyan.club.entity.db.TbClubOnlineMemberAccountStream;
import com.quanyan.club.entity.vo.req.ReqClubMemberAccountStreamPage;
import com.quanyan.club.entity.vo.req.ReqClubMemberRecharge;
import com.quanyan.club.entity.vo.resp.RespClubFinanceBillDetail;
import com.quanyan.club.entity.vo.resp.RespClubFmgIndexPage;
import com.quanyan.club.entity.vo.resp.RespClubMemberAccount;
import com.quanyan.club.entity.vo.resp.RespClubMemberAccountDetail;
import com.quanyan.club.entity.vo.resp.RespClubMemberAccountStream;
import com.quanyan.club.entity.vo.resp.RespClubMemberBillInfo;
import com.quanyan.club.entity.vo.resp.RespClubMemberRemainder;
import com.quanyan.club.entity.vo.resp.RespClubUnsettlementActivity;
import com.quanyan.common.Plugin.PageObj;
import com.quanyan.orderpay.response.RespPreOrder;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * Created by zhuo.shi on 2016/6/7.
 * 俱乐部财务管理服务
 */
public interface ClubFinanceMgmService {

    /**
     * 俱乐部财务管理主页
     *
     * @param clubId 俱乐部ID
     */
    RespClubFmgIndexPage clubFmgIndexPage(Integer clubId, String appVersion);

    /**
     * 获取俱乐部月度活动账单流水列表  （分页）
     *
     * @param clubId   俱乐部ID
     * @param month    统计的月份
     * @param pageNo   页码
     * @param pageSize 每页记录数
     */
    List<RespClubFinanceBillDetail> getClubFinanceBillDetails(Integer clubId, Date month,
                                                              Integer pageNo, Integer pageSize);

    /**
     * 获取一个活动结算后的账单详情
     */
    RespClubFinanceBillDetail getClubFinanceBillDetail(Integer activityId,
                                                       Integer clubId, Integer type);

    /**
     * 获取俱乐部月度结算活动的个数
     *
     * @param clubId 俱乐部ID
     * @param month  月份
     */
    Integer countClubFinanceBillDetails(Integer clubId, Date month);

    /**
     * 计算某俱乐部在时间段内的线上收入
     *
     * @param clubId 俱乐部ID
     * @param start  开始时间
     * @param end    结束时间
     */
    BigDecimal getClubOnlineFund(Integer clubId, Date start, Date end);

    /**
     * 计算某俱乐部在时间段内的线下收入
     *
     * @param clubId 俱乐部ID
     * @param start  开始时间
     * @param end    结束时间
     */
    BigDecimal getClubOfflineFund(Integer clubId, Date start, Date end);

    /**
     * 获取俱乐部没有结算的资金
     *
     * @param clubId 俱乐部ID
     */
    BigDecimal getClubUnsettlmentActivityTotalFund(Integer clubId);

    /**
     * 获取俱乐部未结算的活动列表
     *
     * @param clubId   俱乐部ID
     * @param pageNo   页码
     * @param pageSize 每页记录条数
     */
    List<RespClubUnsettlementActivity> getClubUnsettlementActivities(Integer clubId, Integer pageNo, Integer pageSize);

    /**
     * 计算俱乐部未计算的活动个数
     *
     * @param clubId 俱乐部ID
     */
    Integer countClubUnsettlementActivities(Integer clubId);

    /**
     * 获取俱乐部成员账户列表
     *
     * @param clubId   俱乐部ID
     * @param pageNo   页码
     * @param pageSize 每页记录条数
     */
    List<RespClubMemberAccount> getClubMemberAccounts(Integer clubId, Integer pageNo,
                                                      Integer pageSize, String appVersion);

    /**
     * 获取俱乐部成员账户总个数
     *
     * @param clubId 俱乐部ID
     */
    Integer countClubMemberAccounts(Integer clubId);

    /**
     * 获取俱乐部所有成员的资金总和
     *
     * @param clubId 俱乐部ID
     */
    BigDecimal getClubMemberTotalFund(Integer clubId, String ver);

    /**
     * 俱乐部成员线下充值
     */
    Boolean clubMemberOfflineFundRecharge(Integer uid, Integer clubId, BigDecimal amount, String remark);

    /**
     * 局部成员线下扣费
     */
    Boolean clubMemberOfflineFundDedut(Integer uid, Integer clubId, BigDecimal amount, String remark);

    /**
     * 获取俱乐部成员在俱乐部中的线下账户
     */
    TbClubOfflineMemberAccount getClubMemberOfflineAccount(Integer uid, Integer clubId);

    /**
     * 获取俱乐部成员在俱乐部中的线上账户
     */
    TbClubOnlineMemberAccount getClubMemberOnlineAccount(Integer uid, Integer clubId);

    /**
     * 获取个人账单列表（分页）
     */
    List<RespClubMemberBillInfo> getClubMemberBillInfos(Integer uid, Integer clubId, Integer pageNo, Integer pageSize);

    /**
     * 俱乐部成员充值
     */
    APIResponse<RespPreOrder> memberRecharge(ReqClubMemberRecharge reqClubMemberRecharge, int uid, String userClientIp,HttpServletRequest request);

    /**
     * 俱乐部成员余额
     */
    RespClubMemberRemainder memberRemainder(int clubId, int uid);

    /**
     * 俱乐部成员账户明细
     */
    PageObj<RespClubMemberAccountStream> memberStream(ReqClubMemberAccountStreamPage reqClubMemberAccountStreamPage, int uid);

    /**
     * 俱乐部成员账户明细详情
     */
    APIResponse<RespClubMemberAccountDetail> memberDetail(String source, int id, int uid, int clubId);

    /**
     * 俱乐部成员账户名字（外部系统交易号）
     */
    List<TbClubOnlineMemberAccountStream> getClubOnlineMemberAccountStreamByOutTradeNo(int clubId, int uid, String outTradeNo, byte status);

    /**
     * 俱乐部成员线上账户余额
     */
    TbClubOnlineMemberAccount getClubOnlineMemberAccount(int clubId, int uid);
}
